package com.im.controller;

import com.im.utils.TokenUtil;
import com.im.web.response.Result;
import com.im.web.response.ReturnCode;
import io.jsonwebtoken.Claims;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;


/**
 * 用户 Token 管理接口
 */
@Slf4j
@RestController
@RequestMapping("/token")
@Tag(name = "Token 管理")
public class TokenController {
    @Resource
    private TokenUtil tokenUtil;

    /**
     * 生成用户 Token
     * @param userId 用户 ID
     * @param username 用户名
     * @return Token 字符串
     */
    @Operation(description = "生成 Token")
    @PostMapping("/generate")
    public Result<String> generateToken(@RequestParam Integer userId, @RequestParam String username,@RequestParam String phone) {
        String token = tokenUtil.generateToken(userId, username,phone);
        return Result.success(token);
    }

    /**
     * 获取 Token 解析的信息
     * @param token 用户 Token
     * @return 解析后的 Claims
     */
    @Operation(description = "解析 Token")
    @GetMapping("/parse")
    public Result<Claims> parseToken(@RequestParam String token) {
        Claims claims = tokenUtil.parseToken(token);
        return claims != null ? Result.success(claims) : Result.fail(ReturnCode.INTERNAL_SERVER_ERROR,"Token 解析失败");
    }

    /**
     * 验证 Token 是否有效
     * @param token 用户 Token
     * @return 是否有效
     */
    @Operation(description = "验证 Token")
    @GetMapping("/validate")
    public Result<Boolean> validateToken(@RequestParam String token) {
        boolean isValid = tokenUtil.validateToken(token);
        return Result.success(isValid);
    }

    /**
     * 刷新 Token
     * @param token 旧 Token
     * @return 新 Token
     */
    @Operation(description = "刷新 Token")
    @PostMapping("/refresh")
    public Result<String> refreshToken(@RequestParam String token) {
        String newToken = tokenUtil.refreshToken(token);
        return newToken != null ? Result.success(newToken) : Result.fail(ReturnCode.INTERNAL_SERVER_ERROR,"Token 刷新失败");
    }

    /**
     * 删除 Token（退出登录）
     * @param userId 用户 ID
     * @return 操作结果
     */
    @Operation(summary = "删除 Token（退出登录）")
    @PostMapping("/invalidate")
    public Result<String> invalidateToken(@RequestParam Integer userId) {
        tokenUtil.invalidateToken(userId);
        return Result.success("Token 已失效");
    }
}
